package com.grape.utils;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.grape.constants.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;


/**
 * 类描述： 请求工具类
 *
 * @author  putao
 * @email   2628279194@qq.com
 */
public class ReqUtils {

    public static final String POST = "post";

    public static final String GET = "get";

    private static final Logger LOG = LoggerFactory.getLogger(ReqUtils.class);

    /**
     * 通用请求返回，统一解析错误处理
     * @param url       请求地址
     * @param reqMethod 请求方法类型
     * @return          jsonObject
     */
    public static JSONObject getJsonObject(String url, String reqMethod, String jsonBody) {
      return getJsonObject(url,reqMethod,jsonBody,false);
    }

    /**
     *通用请求返回，统一解析错误处理
     * @param url       请求地址
     * @param reqMethod 请求方法类型
     * @param formData 是否通过form传递
     * @param formKey 使用form传递参数时，指定form的key
     * @return
     */
    public static JSONObject getJsonObject(String url, String reqMethod, String jsonBody,boolean formData,String formKey) {
        //获取令牌
        String remoteResult = null;
        //链式构建请求
        switch (reqMethod) {
            case POST:
                HttpRequest request=HttpRequest.post(url);
                if(formData){
                    if(StringUtils.isBlank(formKey)){
                        JSONObject jsonObject = JSON.parseObject(jsonBody);
                        for (Map.Entry<String, Object> stringObjectEntry : jsonObject.entrySet()) {
                            if(stringObjectEntry.getValue() instanceof List){
                                jsonObject.put(stringObjectEntry.getKey(),JSON.toJSONString(stringObjectEntry.getValue()));
                            }
                        }
                        request = request.form(jsonObject);
                    }else{
                        request = request.form(formKey,jsonBody);
                    }
                }else{
                    request=request.body(jsonBody);
                }
                remoteResult = request.header("Authorization", "Bearer sk-xGI89KAUgZMAUHNCA3tg8foSBdiMQFN5SMv4U0f4INm1iTvE")
                        .timeout(Constants.TIMEOUT)
                        .execute().body();
                break;
            case GET:
                remoteResult = HttpRequest.get(url)
                        .timeout(Constants.TIMEOUT)
                        .execute().body();
                break;
            default:
                break;
        }
        //统一异常处理与转换
        try {
            return JSON.parseObject(remoteResult);
        } catch (Exception e) {
            LOG.error("----------解析异常:" + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 通用请求返回，统一解析错误处理
     * @param url       请求地址
     * @param reqMethod 请求方法类型
     * @param formData  是否通过form传递
     * @return          jsonObject
     */
    public static JSONObject getJsonObject(String url, String reqMethod, String jsonBody,boolean formData) {
        return getJsonObject(url, reqMethod, jsonBody, formData,null);
    }

    /**
     * 通用请求返回，统一解析错误处理
     * @param url       请求地址
     * @param reqMethod 请求方法类型
     * @return jsonObject
     */
    public static JSONObject getJsonObject(String url, String reqMethod) {
        return getJsonObject(url,reqMethod,StringUtils.EMPTY);
    }

    /**
     * 请求返回jsonArray
     * @param url       请求地址
     * @param reqMethod 请求方法类型
     * @return jsonArray
     */
    public static JSONArray getJsonArray(String url, String reqMethod) {
        JSONObject jsonx = getJsonObject(url, reqMethod);
        if (ObjectUtil.isNotEmpty(jsonx)) {
            String jsonData = jsonx.getString(Constants.DATA);
            JSONArray objects = JSON.parseArray(jsonData);
            return objects;
        }
        return null;
    }

    /**
     * 请求返回指定类型的List
     * @param url 请求地址
     * @param reqMethod 请求方法类型
     * @param clazz 需要返回的list类型
     * @param <T>
     * @return
     */
    public static <T> List<T> getJsonArray(String url, String reqMethod, Class<T> clazz) {
        JSONObject jsonx = getJsonObject(url, reqMethod);
        if (ObjectUtil.isNotEmpty(jsonx)) {
            String jsonData = jsonx.getString(Constants.DATA);
            List<T> parseArray = JSON.parseArray(jsonData, clazz);
            return parseArray;
        }
        return null;
    }

    /**
     * 通用请求，可传入class，转换为需要的class对象
     * @param url 请求地址
     * @param reqMethod 请求方法类型
     * @param clazz 需要转换的class
     * @param <T>
     * @return 返回需要的class对象
     */
    public static <T> T req(String url, String reqMethod,  Class<T> clazz) {
        JSONObject jsonObject = getJsonObject(url, reqMethod);
        if(jsonObject!=null){
            return JSON.parseObject(jsonObject.getString(Constants.DATA), (Type) clazz);
        }
        return null;
    }

    /**
     * 拼接参数前缀 ？和 &
     * @param url   路劲
     * @return      拼接后路径
     */
    public static String getPrefix(String url) {
        if (url.contains(Constants.QUESTION_MARK)) {
            return Constants.AND;
        } else {
            return Constants.QUESTION_MARK;
        }
    }
}
